Multithreaded memory manager to de-allocate memory objects using private freelists

ABSTRACT

A method for memory de-allocation may include identifying, by a processing device, a first memory object to be de-allocated within a scope of a function, creating a private freelist associated with the function, the private freelist comprising a reference to the first memory object, performing, within the scope of the function, a plurality of iterations to de-allocate a plurality of memory objects, wherein each iteration comprises adding, to the private freelist, a reference to a memory object of the plurality of memory objects, and causing, by a processing device, a public freelist to reference the private freelist.

TECHNICAL FIELD

This disclosure relates to operating systems, and in particular, to a multithreaded memory manager that may be employed by an operating system.

BACKGROUND

An operating system may include a memory manager to allocate and de-allocate memory spaces, via a virtual memory address space mapped to a physical memory address space associated with a memory, for the execution of software applications. Multiple processing threads (referred to as “threads” herein) managed by the operating system may attempt to allocate and de-allocate (also referred to as “free”) a same location in the memory address space, thus creating the risk of concurrent accesses to the same portion of the memory device by multiple threads. For example, a concurrent access may occur if a first thread running on a first processor tries to read a memory location that had been freed by a second thread running on a second processor, thus creating a read inconsistency for the first thread.

BRIEF DESCRIPTION OF THE DRAWINGS

The present disclosure is illustrated by way of example, and not by way of limitation, in the figures of the accompanying drawings.

FIG. 1 illustrates a multi-task operating environment according to an implementation of the present disclosure.

FIG. 2 illustrates a heap associated with a process according to an implementation of the present disclosure.

FIG. 3A illustrates a detached private freelist and a public freelist according to an implementation of the present disclosure.

FIG. 3B illustrates a private freelist attached to a public freelist according to an implementation of the present disclosure.

FIG. 4A is a flow diagram illustrating a method to construct a private freelist according to an implementation of the present disclosure.

FIG. 4B is a flow diagram illustrating a method to construct a private freelist according to another implementation of the present disclosure.

FIG. 5 is a block diagram illustrating an exemplary computer system according to an implementation of the present disclosure.

DETAILED DESCRIPTION

To prevent concurrent accesses to the same memory location, a memory manager needs to free memory objects in a manner synchronized across a plurality of processors of a computer system. “Memory object” herein refers to a portion of memory, or memory buffer, which is identified by its starting address in a chosen address space (e.g., a virtual or physical address space) and size (also referred to as “memory object type”). The memory manager may maintain a public freelist that is accessible by multiple processors to track memory objects that had been freed by different threads running on different processors. Upon destroying a memory object (i.e., de-allocating the memory buffer occupied by the memory object), the memory manager may add a reference to the memory object to the public freelist. The reference may be represented by a starting address of the memory object in a chosen address space. The memory manager may reuse memory objects on the public freelist to allocate memory in response to future memory allocation requests. Measurements, however, have shown that the operations to synchronize the public freelist across multiple threads running on multiple processors consume a significant amount of computing resources (e.g., processing cycles).

Aspects of the present disclosures address the above noted and other deficiencies by providing a method and system of memory object de-allocation. In accordance to one or more aspects of the present disclosure, the efficiency of memory de-allocation may be improved by first building up a private freelist of memory objects without synchronizing the private freelist with other processing threads, and then attaching the private freelist onto a public freelist using an atomic operation.

In certain implementations, one or more private freelists may be associated with a memory page (e.g., a separate private free list may be provided for each memory object size). A head pointer to such a private freelist may point to the first free (de-allocated) memory object within the memory page, and each free memory object may store a pointer to the next free memory object within the memory page. Assuming that a function owns the memory objects that it de-allocates, adding a reference to a memory object to the private freelist does not require synchronization with other processing threads.

In accordance with one or more aspects of the present disclosure, a private freelist may be created as a detached freelist responsive to identifying the first memory object to be de-allocated. The head pointer to the newly created freelist may be stored as visible to the current thread (but invisible to other threads) within the current function scope or as visible to the current CPU (but not to other CPUs). In subsequent iterations, more memory objects to be de-allocated may be identified. A memory object may be added to the private freelist without synchronization with other processing threads if the page address of such a memory object matches the page address of the private freelist.

In an illustrative example, a bulk de-allocation (or bulk-free represented as “bulk_free( )” in an application) API call may be implemented. The calling function may need to de-allocate several memory objects. Inside the bulk-free function, one or more detached freelists may be stored on the local stack associated with the function. The function may iterate through the memory objects to be de-allocated, and adding each memory object to a corresponding detached private freelist responsive to ascertaining that the page address of the memory object matches the page address of the detached private freelist. Before exiting, the bulk-free function may synchronize the detached private freelists with corresponding public freelists, e.g., by adding, to a public freelist, the head pointer of a corresponding private freelist, as described in more details herein below.

FIG. 1 illustrates a multi-task operating environment 100 according to an implementation of the present disclosure. Referring to FIG. 1, the multi-task operating environment 100 may include a computing system 101 that may further include one or more processors 102 and a memory device 104 operably coupled to processors 102. The processors 102 may be hardware processing devices (such as central processing units (CPUs) or graphics processing units (GPUs)) that may be programmed to execute one or more software applications (also referred to as programs). The software applications may include system software (e.g., an operating system 108) or user software applications. Memory device 104 may be a physical device to store data relating to the execution of the one or more software applications by the one or more processors 102.

Operating system 108 is a software application loaded at the boot of the computer system to manage the execution of one or more user software applications of computer system 101. A process is an instance of a software application being executed on processors 102. A process may include one or more threads 106A, 106B. A thread is a sequence of program instructions that, when executed, can be controlled separately by operating system 108. Threads of a process may share certain resources of the process (e.g., shared process address space). Thus, the software applications may be executed as threads 106A-106B on processors 102 of the computer system 101.

In one implementation, the software applications may include function calls that, within their scope, include operations to manipulate memory objects defined in the software applications. A memory object may be stored in a memory buffer which may be referenced by a memory address and optionally by a symbolic identifier. Such a memory buffer is also referred herein as a “memory object” for convenience of notations. The software applications, during execution, may request the operating system 108 to allocate certain amount of memory space to store the memory objects defined by the software applications. In one implementation, operating system 108 may further include a memory manager 110 to provide the memory allocation and de-allocation services to software applications running as the processes or threads 106A-106B on processors 102. The memory allocation and de-allocation services may include tracking the corresponding freed memory objects.

The information stored in memory device 104 may be accessed (e.g., by a read or write operation) via physical addresses defined in a physical memory address space 114. To improve the efficiency to access memory device 104, memory manager 110 may address the memory objects residing in the memory device 104 using virtual memory addresses that may be translated to physical memory addresses. The address translation may be facilitated by memory address mappings using hardware or software means such as a paging table.

Virtual memory address space 112 can be divided into multiple virtual memory pages 124. Each of the virtual memory pages 124 may be a fixed-size buffer in the virtual memory address space 112. Similarly, physical memory address space may be divided into page frames 126. Each of the page frames may also be a fixed-size buffer in the physical memory address space 114.

In one implementation, operating system 108 may be a multi-task operating system that manages the execution of one or more processes concurrently. Operating system 108 may include scheduler 109 to schedule the execution order of the processes on different processors. Operating system 108 may also include memory manager 110 to control the use of memory 104 by different processes. In some implementations, memory manager 110 may associate each process with a respective section of virtual memory address space (referred to as a process memory space).

The process memory space associated with a process of a corresponding program may include a heap 116 and a stack 117. The heap 116 is a portion in the virtual memory address space that may be used to allocate memory spaces variables, strings, arrays, structures, and other suitable memory objects utilized by a software application. In one implementation, heap 116 may include a number of memory pages. A memory page can be a virtual memory page, a page frame, or a suitable logical partition of a memory address space associated with memory 104. The size of allocated memory space in the heap 106 may also vary as the program may dynamically allocate and de-allocate memory spaces for memory objects specified in the software application during the execution. For example, a memory allocation function call (e.g., malloc( ) in C programming language) may be used to allocate a portion of memory 104 for a pointer variable, and a memory free function call (free( )) may de-allocate the portion of memory 104.

The stack 117 is located at the top portion of the process memory space associated with the process. The stack 117 may contain all the environment (shell) variables used to invoke the program. A process table may include a process identifier, a pointer to the heap 116, and a pointer to the stack 117.

A process executing on processors 102 may be carried out through multiple threads such as threads 106A-106B. Each thread may execute a subset of instructions of the process including function calls that, within their respective scope, may include memory allocation and memory de-allocation operations. The threads of a process may share the process memory space (including the heap 116) associated with the process, but each thread may maintain its own local stack. In one implementation, the local stack associated with a thread may store certain information relating to memory allocation and de-allocation function calls associated with the thread.

A thread may need to allocate memory space for memory objects defined in the program. Memory manager 110 may receive a memory allocation function call (e.g., malloc( )) to allocate memory space for a memory object defined in a program, and in accordance with the call, allocate a portion of memory space for the memory object in the heap 116 associated with the process. Depending on the size of the requested memory object, the memory manager may allocate memory space for the memory object using a page allocator and/or a slab allocator of memory manager 110.

If the size of the memory object exceeds a certain size threshold (e.g., larger than a virtual memory page), memory manager 110 may use the page allocator to allocate one or more virtual memory pages for the memory object.

To allocate memory more efficiently, memory manager 110 may include a slab allocator to allocate multiple smaller memory objects (e.g., having the size falling below a certain size threshold) within a memory page. To facilitate the management of memory objects of different sizes, the slab allocator may classify memory objects into classes in view of their sizes, and allocate memory objects according to their classes. In one implementation, memory objects belonging to a given class may be allocated in a contiguous area (referred to as a “slab”) in the virtual memory address space 112.

Referring to FIG. 1, threads 106A-106B may include operations to allocate memory space to store a memory object via a memory allocation function call (e.g., malloc( )). Responsive to receiving the memory allocation call, memory manager 110 may correspondingly identify free memory objects in a memory page within heap 116 to reuse for the memory allocation call. In some implementations, references to the free memory objects may be recorded in a public freelist 120 that is accessible by multiple threads.

At the end of the life cycle of an allocated memory object, the process may make a de-allocate function call (such as free( ) in C programming language) to request memory manager 110 to free the allocated memory object and make the memory space associated with the allocated memory objects available for other memory allocation function calls. Under some situations, the call to allocate a memory object and the call to de-allocate the memory space may be executed by two different threads (referred to as remote de-allocation). Further, these two threads may be associated with two different processors. When a memory object is to be de-allocated remotely, the public freelist 120 needs to be updated in a manner synchronized across all processors (e.g., by executing an atomic transaction including updating processor data structures associated with different processors simultaneously). As discussed above, this synchronization is often computationally expensive because the synchronization needs to be carried out across all processors. When multiple memory objects are to be de-allocated, the multiple synchronization operations may become the bottleneck for executing the de-allocation function calls.

Instead of executing a synchronized instruction each time to add a memory object directly to public freelist 120, implementations of the present disclosure may provide a bulk-free function call (e.g., bulk_free( )) that is capable of de-allocating several memory objects 118A-118B (as a bulk) using one synchronization operation. In one implementation, within the scope of the bulk-free function call, memory manager 110 may construct a private freelist 122 containing references to several memory objects 118A-118B, whereas the private freelist 122 is local to the processor and/or is specific to the thread executing the bulk-free function call. At its creation, the private freelist 122 is detached from the public freelist 120 and cannot be accessed via public freelist 120. Because the private freelist 122 is local to the processor and is not accessible by other processors, memory objects 118A, 118B to be freed may be added to private freelist 122 without the need to invoke synchronization across multiple processors.

Implementations of the present disclosure provide the bulk-free function call (bulk_free( )) as an application programming interface (API) function call that can be called in software applications. In a software application, the bulk-free function may be invoked to de-allocate several memory objects defined in the software application.

FIG. 2 illustrates a heap 200 associated with a process according to an implementation of the present disclosure. As shown in FIG. 2, memory objects may be classified into different memory classes 202 in view of their sizes. For example, the first class may include memory objects of one to four bytes. Each additional class may include memory objects whose sizes increase by a fixed amount of bytes (e.g., four bytes). Thus, for each small memory object that needs memory allocation, the slab allocator may identify a class of free memory objects whose size is approximately the same and allocate the memory objects using the free memory objects in that class.

In one implementation, heap 116 may include a memory page 204 used to store memory objects of one or more classes. In another implementation, heap 116 may include several memory pages 204 that are employed to store memory objects of different classes. Memory page 204, as defined before, can be a virtual memory page, a page frame, or a suitable logic partition of a memory address space. The information stored in memory page 204 may be addressed using a base memory address in the memory address space and an offset from the base memory address. In one implementation, memory page 204 may be identified by a page address associated with memory page 204. The page address associated with memory page 204 can be the base memory address associated with memory page 204.

Memory page 204 may be used to store memory objects of certain classes. As shown in FIG. 2, memory page 204 may store memory objects (e.g., m1-m7) of a first class 206 (1-4 bytes) and memory objects (e.g., m8-m14) of a second class 208 (5-8 bytes). The slab allocator may keep track of the allocation and de-allocation of memory objects using list data structures stored in memory page 204.

Memory page 204 may include a metadata section 210 to store certain metadata relating to page memory 204 and the memory objects stored therein. In one implementation, metadata section 210 may be part of a local stack associated with a thread and local to the thread (or to the functions of the thread). Metadata section 210 may store a data structure that is exclusively accessible by a given thread (and thus the processor on which the process runs) that owns heap 116. For example, the metadata section 210 may store the head pointers of one or more private freelists 212A-212B of memory objects to be freed, and optionally counters 214 to record the number of memory objects on each private freelist. The memory objects to be freed may be identified through a bulk-free function call. In one implementation, references to memory objects (e.g., m1-m3, m6, m9-m11, m14) to be freed may be placed on private freelists 212A 212B (e.g., m1->m2->m3->m6, and m9->m10->m11->m14) without invoking synchronization operations because these private freelists are local to the processor and are detached from public freelist 216. Each private freelist may include a head memory object (e.g., m1, m9) through which the memory objects on the private freelists may be retrieved by walking through private freelists. For example, starting from the head memory object (e.g., m1, m9), each memory object may include a pointer pointing to a reference to a next memory object on a private freelist. At the end of the private freelist, the tail memory object (e.g., m6, m14) may include a pointer pointing to a pre-defined special pointer (e.g., a NULL pointer) indicating the end of the private freelist. Thus, memory manager 110 may walk through a private freelist until reaching the tail memory object (e.g., m6, m14) including a pointer pointing to a NULL pointer.

To facilitate the identification of a tail memory object on a private freelist, the reference to tail memory object (e.g., m6, m14) may be cached as a tail pointer in the metadata section 210. Because the tail pointer contains the reference to the tail memory object, memory manager 110 may identify the tail memory object without walking through the private freelist. In another implementation, counters 214 may be used to cache certain information relating to the tail memory object on the private freelist. In one implementation, counters 214 may be used to cache a number (N) of memory objects on the private freelist to enable memory manager 110 to reach the tail memory object by walking the number (N) of steps on private freelist 212A, 212B without checking for the NULL pointer.

Memory objects that have been freed may be placed on a public freelist 216 that is visible to all processors of a computer system. In one implementation, public freelist 216 may be stored at a memory location external to heap 116. In one implementation, memory manager 110 may construct public freelist 216 as a list data structure containing references to the memory objects that were already freed and construct a private freelist as a data structure containing references to the memory objects to be freed by a bulk-free function call.

FIG. 3A illustrates a memory space 300 including a detached private freelist 302 including memory objects 306A-306C to be de-allocated and a public freelist 304 including free memory objects 308A-308C according to an implementation of the present disclosure.

In one implementation, memory manager 110 may determine several memory objects 306A-306C to be freed within the function scope of a bulk-free function call. Memory manager 110 may construct private freelist 302 based on references to memory objects 306A-306C. Responsive to determining memory objects 306A-306C, memory manager 110 may identify a first memory object 306C and determine the memory page in which memory object 306C is stored. Memory manager 110 may then create a private freelist 302 in the memory page and place a reference to memory object 306C on private freelist 302. Further, memory manager 110 may initiate a head pointer 316 of private freelist 302 in a metadata section of the memory page. The metadata section may be part of the local stack associated with a bulk-free function call to de-allocate memory objects 306A-306C. At the initiation, memory manager 110 may initiate a pointer 310C stored in memory object 306C to point to a NULL pointer. Pointer 310C is used to point to the reference to a next memory object on private freelist 302. When pointer 310C points to a NULL pointer, it indicates that memory object 306C is the tail memory object. In one implementation, at the initiation, memory manager 110 may also optionally initiate a tail pointer to point to the reference to memory object 306C. The tail pointer may be used to cache the reference to the tail memory object 306C on private freelist 302 so that memory manager may identify tail memory object 306C without walking through the private freelist 302. In another implementation, memory manager 110 may optionally initiate a counter in the metadata section to a value of one (“1”) reflecting the number of memory object references on private freelist 302. The reference to memory object 306C is added to private list 302 without invoking synchronization, and the head pointer 316, the tail pointer and the counter may be stored in a data structure local to the thread (or the processor executing the thread) and invisible to other processors.

Responsive to determining a reference to a subsequent incoming memory object (e.g., 306B or 306A) to be freed within the function scope, memory manager 110 may first determine whether the received memory object belongs to the memory page by comparing the page address associated with the head pointer 316 of private freelist 302 with the page address of the subsequent memory object (e.g., memory object 306B). If they match, the reference to the received memory object may be added to private freelist 302. For example, responsive to receiving memory object 306B whose page address matches that of head pointer 316, a reference to memory object 306B may be added to the private freelist 302 by updating pointer 310B of memory object 306B to the reference to memory object 306C, and updating the private head pointer 316 to point to the reference to memory object 306B. Further, responsive to receiving memory object 306A, a reference to memory object 306A may be added to the private freelist 302 by further updating pointer 310A of memory object 306A to the reference to memory object 306B, and further updating the private head pointer 316 to point to the reference to memory object 306A.

In one implementation, each time the reference to a memory object is added to private freelist 302, the counter may be updated to reflect the total number of references to memory objects on private freelist 302. The addition of references to memory objects and the updates to the head pointer 316 and the counter are performed without invoking synchronization across multiple processors. In one implementation, the page address of head pointer 316 is also cached in the data structure of private freelist 302.

Responsive to determining that the page address of a subsequent memory object (e.g., 306B or 306A) does not match the page address of the head pointer 316, in one implementation, memory manager 110 may initiate operations to attach private freelist 302 onto public freelist 304 as described below. After attaching private freelist 302 onto public freelist 304, memory manager 110 may re-initiate private freelist 302 using the unmatched memory object. In another implementation, if more than one private freelists are associated with a bulk-free function call, memory manager 110 may try to match the unmatched, subsequent memory object with another private freelist. If memory manager 110 cannot identify any private freelist to match the page address of the subsequent memory object, memory manager 110 may initiate operations to attach one of the private freelists onto public freelist 304. After the attachment, memory manager 110 may re-initiate one private freelist using the unmatched memory object. In yet another implementation, memory manager 110 may, within the function scope of a bulk-free function call, continue to a next memory object to be freed (e.g., if memory object 306B cannot be matched, memory manager 110 may move to the next memory object 306A) to determine if the page address of the next memory object matches the page address of the head pointer 316 of private freelist 302. After all matching memory objects have been successfully de-allocated by attaching onto public freelist 304 in a first round of iteration, the unmatched memory objects (e.g., 306B) may be handled in a second round of iteration by re-initiating private freelist 302. In one implementation, the page address of the head pointer 316 is cached in the metadata section of the memory page as it does not change.

As shown in FIG. 3A, private freelist 302 as constructed may contain a list of references to memory objects 306A-306C that are linked from a head memory object 306A to a tail memory object 306C. In one implementation, the reference to head memory object 306A may be recorded in the metadata section of a memory page as the head pointer 316 of private freelist 302. Memory manager 110 may manage private freelist 302 through the head pointer 316. Each memory object on private freelist 302 may include a respective pointer 310A-310C to store the reference of the next memory object on private freelist 302. For example, memory object 306A may include a pointer 310A referencing memory object 306B, and memory object 306B may include a pointer 310B referencing memory object 306C. The pointer 310C of tail memory object 306C may point to a NULL pointer. A memory page may be associated with one or more private freelists of memory objects generated by one or more threads. Because private freelist 302 is local to the current processor, references to memory objects 306A-306B may be added to private freelist 302 without invoking synchronization with other processors, thus enabling memory manager 110 to build up private freelist 302 quickly.

A public freelist 304 visible by different processors may include references to memory objects 308A-308C that have already been freed and are available for memory allocation function calls to reuse these freed memory objects 308A-308C. Public freelist 304 may contain a list of references to memory objects 308A-308C that are linked from a head memory object 308A to a tail memory object 308C. In one implementation, the reference to head memory object 308A may be recorded in a public section of a memory space as the head pointer 318 of public freelist 304. Each memory object on public freelist 304 may include a respect pointer 312A-312C to store the reference of the next memory object on public freelist 304. Pointer 312C of tail memory object 308C may point to a NULL pointer, indicating end of public freelist 304. Memory objects 308A-308C placed on public freelist 304 are visible by all processors through head pointer 318.

At conclusion of the bulk-free function call or in response to an attaching event (such as identifying an unmatched memory object) as described above, memory manager 110 may attach private freelist 302 onto public freelist 304 to make memory objects 306A-306C visible to other processors and available for reuse. In one implementation, memory manager 110 may first identify the tail memory object 306C on private freelist 302. As discussed above, in one implementation, memory manager 110 may, from head pointer 316, walk through private freelist 302 until reaching memory object 306C whose pointer 310C points to a NULL pointer. In another implementation, memory manager 110 may have access to the tail pointer that caches the reference to tail memory object 306C, and identify the reference to tail memory object 306C based on the tail pointer. In yet another implementation, memory manager 110 may have access to a counter storing a total number (N) of references to memory objects on private freelist 302. Memory manager 110 may identify tail memory object 306C by walking through the number (N) of memory objects on private freelist 302 (without checking for a NULL pointer) to reach tail memory object 306C. Responsive to identifying tail memory object 306C, memory manager 110 may store, in the pointer 310C of the tail memory object 306C, a reference (shown as the link 314) to the head memory object 308A on the public freelist 304 to create a link 314 between private freelist 302 and public freelist 304. Memory manager 110 stores the reference to the head memory object 308A without invoking synchronization across multiple processors.

In response to storing, in pointer 310C of tail memory object 306C, the reference to head memory object 308A of public freelist 304, memory manager 110 may update head pointer 316 of private freelist 302 to point to a NULL pointer without invoking synchronization across multiple processors because the head pointer 316 of private freelist 302 is also local to the bulk-free function call. FIG. 3B illustrates a private freelist attached to a public freelist while head pointer 316 is updated to point to a NULL pointer according to an implementation of the present disclosure. As shown in FIG. 3B, head pointer 316 of private freelist 302 is updated to point to a NULL pointer and re-initiated for future bulk-free function calls.

Responsive to setting the head pointer 316 of private freelist to a NULL pointer, memory manager 110 may execute a synchronized instruction (e.g., atomic instruction cmpxchg_double) to update the head pointer 318 of public freelist 304 to reflect the attachment of memory objects 306A-306C. The execution of the synchronized instruction may set the head pointer 318 of public freelist 304 to point to the reference to memory object 306A (i.e., previous head memory object of private freelist 302) in synchronization across multiple processors. The successful execution of the synchronized instruction attaches memory objects 306A-306C onto public freelist 304, and makes objects 306A-306C available as free memory objects to future memory allocation function calls. In one implementation, when the tail pointer is used to cache the reference to tail memory object 306C, the synchronized instruction in an atomic execution may also reset the tail pointer to a NULL pointer. In another implementation, when a counter is used to record the number of memory objects on private freelist 302, the synchronized instruction in an atomic execution may also reset the counter value to zero (“0”).

In the event that memory manager 110 fails to store the reference to the head memory object 308A in pointer 310C of tail memory object 306C on private freelist 302, the head memory object 306A on private freelist 302 is not in danger to be exposed to other processors because the reference to head memory object 306A on private freelist 302 is not used during the creation of link 314. In one implementation, in response to failing to creating the link 314, the memory manager 110 may re-execute the operations to try again to store, in pointer 310C of tail memory object 306C, the reference to head memory object 308A. In one implementation, memory manager 110 may re-execute the operations until tail memory object 306C is successfully attached to head memory object 308A.

FIG. 4A is a flow diagram illustrating a method 400 to construct a private freelist according to an implementation of the present disclosure. The method 400 may be performed by processing logic that comprises hardware (e.g., circuitry, dedicated logic, programmable logic, microcode, etc.), software (e.g., instructions run on a processing device to perform hardware simulation), or a combination thereof.

For simplicity of explanation, methods are depicted and described as a series of acts. However, acts in accordance with this disclosure can occur in various orders and/or concurrently, and with other acts not presented and described herein. Furthermore, not all illustrated acts may be required to implement the methods in accordance with the disclosed subject matter. In addition, the methods could alternatively be represented as a series of interrelated states via a state diagram or events. Additionally, it should be appreciated that the methods disclosed in this specification are capable of being stored on an article of manufacture to facilitate transporting and transferring such methods to computing devices. The term article of manufacture, as used herein, is intended to encompass a computer program accessible from any computer-readable device or storage media. In one implementation, the methods may be performed by processors 102 executing memory manager 110 as shown in FIG. 1.

Referring to FIG. 4A, at 402, processors 102 may execute an operating system 108 including a memory manager 110. The memory manager 110 may start to allocate and free memory objects in response to function calls to allocate and de-allocate memory objects defined in programs executing on processors 102.

At 404, the memory manager 110 executing on a processor of a computer system may identify a reference to a first memory object to be freed by a thread executing on the processor. The memory manager 110 may identify the reference to the first memory object in response to receiving a bulk-free function call.

At 406, the memory manager 110 may create a private freelist in a memory page associated with thread and store the reference to the first memory object on the private freelist. Because the private freelist is local to the processor executing the thread and is detached from the public freelist, this private freelist is not visible to other processors. Therefore, the reference to the first memory object may be added to the private freelist without invoking synchronization with other processors.

At 408, memory manager 110 may identify a reference to a second memory object that is to be de-allocated by the thread. The de-allocation of the second memory object may be part of the bulk-free function call (bulk_free( )) to free both the first memory object and the second memory object.

At 410, memory manager 110 may determine that the page address associated with a head pointer (referencing the first memory object) matches the page address associated with the second memory object. The matching page addresses may indicate that the first memory object and the second memory object belong to a same memory page.

At 412, in response to determining that the page addresses of the head pointer and the second memory object match, memory manager 110 may add the reference to the second memory object to the private freelist without invoking synchronization with other processors. In this way, the private freelist may be built up without synchronization and thus quickly.

FIG. 4B is a flow diagram illustrating a method 420 to construct a private freelist according to another implementation of the present disclosure. The method 400 may be performed by processing logic that comprises hardware (e.g., circuitry, dedicated logic, programmable logic, microcode, etc.), software (e.g., instructions run on a processing device to perform hardware simulation), or a combination thereof.

For simplicity of explanation, methods are depicted and described as a series of acts. However, acts in accordance with this disclosure can occur in various orders and/or concurrently, and with other acts not presented and described herein. Furthermore, not all illustrated acts may be required to implement the methods in accordance with the disclosed subject matter. In addition, the methods could alternatively be represented as a series of interrelated states via a state diagram or events. Additionally, it should be appreciated that the methods disclosed in this specification are capable of being stored on an article of manufacture to facilitate transporting and transferring such methods to computing devices. The term article of manufacture, as used herein, is intended to encompass a computer program accessible from any computer-readable device or storage media. In one implementation, the methods may be performed by processors 102 executing memory manager 110 as shown in FIG. 1.

Referring to FIG. 4B, at 422, processors 102 may execute an operating system 108 including a memory manager 110. The memory manager 110 may start to allocate and free memory objects in response to function calls to allocate and de-allocate memory objects defined in programs executing on processors 102.

At 424, memory manager 110 may identify a first memory object to be de-allocated a private freelist within the scope of a function call.

At 426, memory manager 110 may create a private freelist associated with the function. The private freelist may include a reference to the first memory object. The private freelist is local to the processing device executing the function and is detached from a public freelist.

At 428, memory manager 110 may perform, within the scope of the function, several iterations to de-allocate several memory objects. Each iteration may include adding, to the private freelist, a reference to a memory object of the several memory objects. The reference to the memory object is added to the private freelist without invoking synchronization with other processing devices.

At 430, in response to finishing the iterations, memory manager 110 may attach the private list of memory objects onto a public list of memory objects by causing the public list to reference the private freelist.

FIG. 5 illustrates a diagrammatic representation of a machine in the exemplary form of a computer system 500 within which a set of instructions for causing the machine to perform any one or more of the methodologies discussed herein may be executed. In alternative implementations, the machine may be connected (e.g., networked) to other machines in a LAN, an intranet, an extranet, or the Internet. The machine may operate in the capacity of a server or a client machine in a client-server network environment, or as a peer machine in a peer-to-peer (or distributed) network environment. The machine may be a personal computer (PC), a tablet PC, a set-top box (STB), a Personal Digital Assistant (PDA), a cellular telephone, a web appliance, a server, a network router, switch or bridge, or any machine capable of executing a set of instructions (sequential or otherwise) that specify actions to be taken by that machine. Further, while only a single machine is illustrated, the term “machine” shall also be taken to include any collection of machines that individually or jointly execute a set (or multiple sets) of instructions to perform any one or more of the methodologies discussed herein.

The exemplary computer system 500 includes a processing device (processor) 502, a main memory 504 (e.g., read-only memory (ROM), flash memory, dynamic random access memory (DRAM) such as synchronous DRAM (SDRAM) or Rambus DRAM (RDRAM), etc.), a static memory 506 (e.g., flash memory, static random access memory (SRAM), etc.), and a data storage device 518, which communicate with each other via a bus 508.

Processor 502 represents one or more general-purpose processing devices such as a microprocessor, central processing unit, or the like. More particularly, the processor 502 may be a complex instruction set computing (CISC) microprocessor, reduced instruction set computing (RISC) microprocessor, very long instruction word (VLIW) microprocessor, or a processor implementing other instruction sets or processors implementing a combination of instruction sets. The processor 502 may also be one or more special-purpose processing devices such as an application specific integrated circuit (ASIC), a field programmable gate array (FPGA), a digital signal processor (DSP), network processor, or the like. The processor 502 is configured to execute instructions 526 for performing the operations and steps discussed herein.

The computer system 500 may further include a network interface device 522. The computer system 500 also may include a video display unit 510 (e.g., a liquid crystal display (LCD), a cathode ray tube (CRT), or a touch screen), an alphanumeric input device 512 (e.g., a keyboard), a cursor control device 514 (e.g., a mouse), and a signal generation device 520 (e.g., a speaker).

The data storage device 518 may include a computer-readable storage medium 524 on which is stored one or more sets of instructions 526 (e.g., software) embodying any one or more of the methodologies or functions described herein. The instructions 526 may also reside, completely or at least partially, within the main memory 504 and/or within the processor 502 during execution thereof by the computer system 500, the main memory 504 and the processor 502 also constituting computer-readable storage media. The instructions 526 may further be transmitted or received over a network 574 via the network interface device 522.

While the computer-readable storage medium 524 is shown in an exemplary implementation to be a single medium, the term “computer-readable storage medium” should be taken to include a single medium or multiple media (e.g., a centralized or distributed database, and/or associated caches and servers) that store the one or more sets of instructions. The term “computer-readable storage medium” shall also be taken to include any medium that is capable of storing, encoding or carrying a set of instructions for execution by the machine and that cause the machine to perform any one or more of the methodologies of the present disclosure. The term “computer-readable storage medium” shall accordingly be taken to include, but not be limited to, solid-state memories, optical media, and magnetic media.

In the foregoing description, numerous details are set forth. It will be apparent, however, to one of ordinary skill in the art having the benefit of this disclosure, that the present disclosure may be practiced without these specific details. In some instances, well-known structures and devices are shown in block diagram form, rather than in detail, in order to avoid obscuring the present disclosure.

Some portions of the detailed description have been presented in terms of algorithms and symbolic representations of operations on data bits within a computer memory. These algorithmic descriptions and representations are the means used by those skilled in the data processing arts to most effectively convey the substance of their work to others skilled in the art. An algorithm is here, and generally, conceived to be a self-consistent sequence of steps leading to a desired result. The steps are those requiring physical manipulations of physical quantities. Usually, though not necessarily, these quantities take the form of electrical or magnetic signals capable of being stored, transferred, combined, compared, and otherwise manipulated. It has proven convenient at times, principally for reasons of common usage, to refer to these signals as bits, values, elements, symbols, characters, terms, numbers, or the like.

It should be borne in mind, however, that all of these and similar terms are to be associated with the appropriate physical quantities and are merely convenient labels applied to these quantities. Unless specifically stated otherwise as apparent from the following discussion, it is appreciated that throughout the description, discussions utilizing terms such as “determining”, “enabling”, “identifying,” “selecting,” “displaying,” or the like, refer to the actions and processes of a computer system, or similar electronic computing device, that manipulates and transforms data represented as physical (e.g., electronic) quantities within the computer system's registers and memories into other data similarly represented as physical quantities within the computer system memories or registers or other such information storage, transmission or display devices.

The disclosure also relates to an apparatus for performing the operations herein. This apparatus may be specially constructed for the required purposes, or it may include a general purpose computer selectively activated or reconfigured by a computer program stored in the computer. Such a computer program may be stored in a computer readable storage medium, such as, but not limited to, any type of disk including floppy disks, optical disks, CD-ROMs, and magnetic-optical disks, read-only memories (ROMs), random access memories (RAMs), EPROMs, EEPROMs, magnetic or optical cards, or any type of media suitable for storing electronic instructions.

The words “example” or “exemplary” are used herein to mean serving as an example, instance, or illustration. Any aspect or design described herein as “example’ or “exemplary” is not necessarily to be construed as preferred or advantageous over other aspects or designs. Rather, use of the words “example” or “exemplary” is intended to present concepts in a concrete fashion. As used in this application, the term “or” is intended to mean an inclusive “or” rather than an exclusive “or”. That is, unless specified otherwise, or clear from context, “X includes A or B” is intended to mean any of the natural inclusive permutations. That is, if X includes A; X includes B; or X includes both A and B, then “X includes A or B” is satisfied under any of the foregoing instances. In addition, the articles “a” and “an” as used in this application and the appended claims should generally be construed to mean “one or more” unless specified otherwise or clear from context to be directed to a singular form. Moreover, use of the term “an embodiment” or “one embodiment” or “an implementation” or “one implementation” throughout is not intended to mean the same embodiment or implementation unless described as such.

Reference throughout this specification to “one embodiment” or “an embodiment” means that a particular feature, structure, or characteristic described in connection with the embodiment is included in at least one embodiment. Thus, the appearances of the phrase “in one embodiment” or “in an embodiment” in various places throughout this specification are not necessarily all referring to the same embodiment. In addition, the term “or” is intended to mean an inclusive “or” rather than an exclusive “or.”

It is to be understood that the above description is intended to be illustrative, and not restrictive. Many other implementations will be apparent to those of skill in the art upon reading and understanding the above description. The scope of the disclosure should, therefore, be determined with reference to the appended claims, along with the full scope of equivalents to which such claims are entitled. 

What is claimed is:
 1. A method comprising: identifying a first memory object to be de-allocated within a scope of a function; creating a private freelist associated with the function, the private freelist comprising a reference to the first memory object; performing, within the scope of the function, a plurality of iterations to de-allocate a plurality of memory objects, wherein each iteration comprises adding, to the private freelist, a reference to a memory object of the plurality of memory objects; and causing, by a processing device, a public freelist to point to the private freelist.
 2. The method of claim 1, wherein adding, to the private freelist, the reference to the memory object is performed responsive to determining that a page address of the memory object matches a page address of a head pointer of the private freelist.
 3. The method of claim 2, wherein the head pointer of the private freelist points to a reference to a first memory object on the private freelist.
 4. The method of claim 1, wherein adding, to the private freelist, the reference to the memory object is performed without synchronizing, with other processing devices, a head pointer of the public freelist.
 5. The method of claim 1, wherein causing the public freelist to point to the private freelist comprises: setting a pointer stored in a tail memory object of the private freelist to point to a reference to a head memory object on the public freelist; and synchronizing, with other processing devices, a head pointer of the public freelist to point to a reference to a head memory object on the private freelist.
 6. The method of claim 5, wherein causing the public freelist to point to the private freelist comprises: resetting the head pointer of the private list to point to a NULL pointer.
 7. The method of claim 1, wherein the private freelist is exclusively accessible by the processing device.
 8. A non-transitory machine-readable storage medium storing executable instructions which, when executed, cause a processing device to: identify a first memory object to be de-allocated by a thread associated with the processing device; create a private freelist associated with the thread, the private freelist comprising a reference to the first memory object; identify a reference to a second memory object to be de-allocated by the thread; determine, by the processing device, that a page address of the second memory object and a page address of a head pointer to the private freelist belong to a common memory page; and add the reference to the second memory object to the private freelist.
 9. The non-transitory machine-readable storage medium of claim 8, wherein the executable instructions cause the processing device to add the reference to the second memory object to the private freelist without synchronizing the head pointer to the private freelist with other threads.
 10. The non-transitory machine-readable storage medium of claim 8, wherein the executable instructions further cause the processing device to: cause a public freelist to reference the private freelist.
 11. The non-transitory machine-readable storage medium of claim 10, wherein to cause the public freelist to reference the private freelist, the processing device is further to synchronize the head pointer of the public freelist with other threads.
 12. The non-transitory machine-readable storage medium of claim 11, wherein to cause the public freelist to reference the private freelist, the processing device is further to reset the head pointer of the private list to point to a NULL pointer.
 13. The non-transitory machine-readable storage medium of claim 8, wherein the private freelist is exclusively accessible by the thread.
 14. A system comprising: a memory associated with a memory space comprising a plurality of memory objects; and a processing device, operatively coupled to the memory, to: identify a first memory object to be de-allocated within a scope of a function; create a private freelist associated with the function, the private freelist comprising a reference to the first memory object; perform, within the scope of the function, a plurality of iterations to de-allocate a plurality of memory objects, wherein each iteration comprises adding, to the private freelist, a reference to a memory object of the plurality of memory objects; and cause a public freelist to point to the private freelist.
 15. The system of claim 14, wherein the processing device is further to responsive to determining that a page address of the memory object matches a page address of a head pointer of the private freelist, add, to the private freelist, the reference to the memory object.
 16. The system of claim 15, wherein the head pointer of the private freelist points to a reference to a first memory object on the private freelist.
 17. The system of claim 14, wherein the processing device is to add, to the private freelist, the reference to the memory object without synchronizing, with other processing devices, a head pointer of the public freelist.
 18. The system of claim 14, wherein to cause the public freelist to point to the private freelist, the processing device is to: set a pointer stored in a tail memory object of the private freelist to point to a reference to a head memory object on the public freelist; and synchronize, with other processing devices, a head pointer of the public freelist to point to a reference to a head memory object on the private freelist.
 19. The system of claim 18, wherein to cause the public freelist to point to the private freelist, the processing device is further to reset the head pointer of the private list to point to a NULL pointer.
 20. The system of claim 14, wherein the private freelist is exclusively accessible by the processing device. 